package com.github.wxhnyfy.tool;

import com.github.wxhnyfy.ExcelData;
import com.github.wxhnyfy.NoHeaderSheetData;
import com.github.wxhnyfy.SheetData;
import com.github.wxhnyfy.enums.ToolType;
import com.github.wxhnyfy.service.impl.ApachePoiExcelTool;
import com.github.wxhnyfy.service.impl.EasyExcelTool;
import com.github.wxhnyfy.service.impl.FastExcelTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.List;

/**
 * Excel工具类
 *
 * @author chenwc
 */
public class ExcelTool {
    private static final Logger logger = LoggerFactory.getLogger(ExcelTool.class);
    private static final ApachePoiExcelTool apachePoiExcelTool = new ApachePoiExcelTool();
    private static final EasyExcelTool easyExcelTool = new EasyExcelTool();
    private static final FastExcelTool fastExcelTool = new FastExcelTool();

    /**
     * 设置工具类型
     *
     * @param toolType 工具类型
     */
    public static void setToolType(ToolType toolType) {
        if (toolType == null) {
            logger.error("工具类型不能为空");
            return;
        }
        System.setProperty("excel.tool.type", toolType.getToolName());
    }

    /**
     * 读取Excel文件第 1 个Sheet
     *
     * @param excelFile Excel文件
     * @return sheet数据
     */
    public static SheetData read(File excelFile) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                return fastExcelTool.read(excelFile);
            case EASY_EXCEL:
                return easyExcelTool.read(excelFile);
            case APACHE_POI_EXCEL:
                return apachePoiExcelTool.read(excelFile);
            default:
                logger.error("未知工具类型");
                return null;
        }
    }

    /**
     * 读取整个Excel文件
     *
     * @param excelFile Excel文件
     * @return Excel数据
     */
    public static ExcelData readExcelFile(File excelFile) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                return fastExcelTool.readExcelFile(excelFile);
            case EASY_EXCEL:
                return easyExcelTool.readExcelFile(excelFile);
            case APACHE_POI_EXCEL:
                return apachePoiExcelTool.readExcelFile(excelFile);
            default:
                logger.error("未知工具类型");
                return null;
        }
    }

    /**
     * 指定Sheet名称读取Excel文件
     *
     * @param excelFile Excel文件
     * @param sheetName Sheet名称
     * @return sheet数据
     */
    public static SheetData read(File excelFile, String sheetName) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                return fastExcelTool.read(excelFile, sheetName);
            case EASY_EXCEL:
                return easyExcelTool.read(excelFile, sheetName);
            case APACHE_POI_EXCEL:
                return apachePoiExcelTool.read(excelFile, sheetName);
            default:
                logger.error("未知工具类型");
                return null;
        }
    }

    /**
     * 读取Excel文件第 index 个Sheet
     *
     * @param excelFile  Excel文件
     * @param sheetIndex Sheet下标
     * @return sheet数据
     */
    public static SheetData read(File excelFile, int sheetIndex) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                return fastExcelTool.read(excelFile, sheetIndex);
            case EASY_EXCEL:
                return easyExcelTool.read(excelFile, sheetIndex);
            case APACHE_POI_EXCEL:
                return apachePoiExcelTool.read(excelFile, sheetIndex);
            default:
                logger.error("未知工具类型");
                return null;
        }
    }

    /**
     * 读取excel文件，没有表头的sheet
     *
     * @param excelFile  excel文件
     * @param sheetIndex 要读取的sheet页签下标
     * @return excel文件数据
     */
    public static SheetData readByNoHeaderSheet(File excelFile, int sheetIndex) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                return fastExcelTool.readByNoHeaderSheet(excelFile, sheetIndex);
            case EASY_EXCEL:
                return easyExcelTool.readByNoHeaderSheet(excelFile, sheetIndex);
            case APACHE_POI_EXCEL:
                return apachePoiExcelTool.readByNoHeaderSheet(excelFile, sheetIndex);
            default:
                logger.error("未知工具类型");
                return null;
        }
    }

    /**
     * 读取excel文件，没有表头的sheet
     *
     * @param excelFile  excel文件
     * @param sheetIndex 要读取的sheet页签下标
     * @return excel文件数据
     */
    public static NoHeaderSheetData readByNoHeaderSheetData(File excelFile, int sheetIndex) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                return fastExcelTool.readByNoHeaderSheetData(excelFile, sheetIndex);
            case EASY_EXCEL:
                return easyExcelTool.readByNoHeaderSheetData(excelFile, sheetIndex);
            case APACHE_POI_EXCEL:
                return apachePoiExcelTool.readByNoHeaderSheetData(excelFile, sheetIndex);
            default:
                logger.error("未知工具类型");
                return null;
        }
    }

    /**
     * 自定义读取excel文件的sheet
     *
     * @param excelFile   excel文件
     * @param sheetIndex  要读取的sheet页签下标（从0开始）
     * @param startRow    开始读取的行号（从0开始）
     * @param endRow      结束读取的行号（从0开始）
     * @param startColumn 开始读取的列数（从0开始）
     * @param endColumn   结束读取的总列数（从0开始）
     * @return excel文件数据
     */
    public static SheetData read(File excelFile, int sheetIndex, int startRow, int endRow, int startColumn, int endColumn) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                return fastExcelTool.read(excelFile, sheetIndex, startRow, endRow, startColumn, endColumn);
            case EASY_EXCEL:
                return easyExcelTool.read(excelFile, sheetIndex, startRow, endRow, startColumn, endColumn);
            case APACHE_POI_EXCEL:
                return apachePoiExcelTool.read(excelFile, sheetIndex, startRow, endRow, startColumn, endColumn);
            default:
                logger.error("未知工具类型");
                return null;
        }
    }

    /**
     * 写入Excel文件
     *
     * @param excelFile Excel文件
     * @param sheetData Sheet数据
     */
    public static void write(File excelFile, SheetData sheetData) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                fastExcelTool.write(excelFile, sheetData);
                break;
            case EASY_EXCEL:
                easyExcelTool.write(excelFile, sheetData);
                break;
            case APACHE_POI_EXCEL:
                apachePoiExcelTool.write(excelFile, sheetData);
                break;
            default:
                logger.error("未知工具类型");
        }
    }

    /**
     * 写入Excel文件
     *
     * @param excelFile Excel文件
     * @param sheetData Sheet数据
     */
    public static void writeNoHeaderSheet(File excelFile, NoHeaderSheetData sheetData) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                fastExcelTool.writeNoHeaderSheet(excelFile, sheetData);
                break;
            case EASY_EXCEL:
                easyExcelTool.writeNoHeaderSheet(excelFile, sheetData);
                break;
            case APACHE_POI_EXCEL:
                apachePoiExcelTool.writeNoHeaderSheet(excelFile, sheetData);
                break;
            default:
                logger.error("未知工具类型");
        }
    }

    /**
     * 同一个Excel文件写入多个Sheet
     * 每个工作表由不同的线程生成
     *
     * @param excelFile     Excel文件
     * @param sheetDataList Sheet数据
     */
    public static void writeMultipleSheet(File excelFile, List<SheetData> sheetDataList) {
        ToolType toolType = ToolType.getToolType();
        switch (toolType) {
            case FAST_EXCEL:
                fastExcelTool.writeMultipleSheet(excelFile, sheetDataList);
                break;
            case EASY_EXCEL:
                easyExcelTool.writeMultipleSheet(excelFile, sheetDataList);
                break;
            case APACHE_POI_EXCEL:
                apachePoiExcelTool.writeMultipleSheet(excelFile, sheetDataList);
                break;
            default:
                logger.error("未知工具类型");
        }
    }
}
